package com.ztr.conversion.excel2pdf;

import com.aspose.cells.PdfSaveOptions;
import com.aspose.cells.Workbook;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;

/**
 * <p>
 * Excel 转 Pdf 工具类
 * </p>
 */
@Slf4j
public class Excel2PdfUtil {

    /**
     * 将Excel字节流转换为PDF字节流。
     * 此方法接收一个Excel的字节码表示，并将其转换为PDF格式的字节码。
     * 使用Apache POI库处理Excel文件，并利用Aspose.Cells将Excel保存为PDF格式。
     *
     * @param excelBytes Excel文件的字节码表示。
     * @return 转换后的PDF文件的字节码表示。
     * @throws Exception 如果转换过程中发生错误，将抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static byte[] excelBytes2PdfBytes(byte[] excelBytes) {
        // 使用字节输入流创建Workbook对象，以处理Excel数据。
        Workbook workbook = new Workbook(new ByteArrayInputStream(excelBytes));

        // 设置PDF保存选项，确保所有列都在同一个页面上。
        PdfSaveOptions pso = new PdfSaveOptions();
        pso.setAllColumnsInOnePagePerSheet(true);

        // 使用字节输出流来接收转换后的PDF数据。
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        // 将Workbook保存为PDF格式，输出到字节输出流中。
        workbook.save(outputStream, pso);

        // 返回转换后的PDF的字节码。
        // workbook.save(outputStream, SaveFormat.PDF);
        // 返回生成的`pdf`文件字节码
        return outputStream.toByteArray();
    }


    /**
     * 将Excel字节流转换为PDF文件。
     * 此方法接收Excel的字节码和PDF文件路径作为输入，通过创建临时的Excel文件，
     * 然后将其转换为PDF格式，最后返回生成的PDF文件。
     *
     * @param excelBytes Excel文件的字节码表示。
     * @param pdfFilePath 生成的PDF文件的路径。
     * @return 返回生成的PDF文件对象。
     * @throws Exception 如果转换过程中发生任何错误。
     */
    @SneakyThrows(Exception.class)
    public static File excelBytes2PdfFile(byte[] excelBytes, String pdfFilePath) {
        // 根据Excel的字节码创建Workbook对象
        Workbook workbook = new Workbook(new ByteArrayInputStream(excelBytes));
        // 设置PDF保存选项，确保所有列都在同一个页面
        PdfSaveOptions pso = new PdfSaveOptions();
        pso.setAllColumnsInOnePagePerSheet(true);
        // 将Workbook保存为PDF格式，保存到指定路径
        workbook.save(pdfFilePath, pso);
        // 返回生成的PDF文件对象
        // workbook.save(outputStream, SaveFormat.PDF);
        return new File(pdfFilePath);
    }


}
